package red.stu.pconstraint.engine;

import org.jetbrains.annotations.NotNull;
import red.stu.pconstraint.ProcessStorageApi;
import red.stu.pconstraint.dto.mapper.ProcessMapper;

/**
 * 工作空间
 * @author yihrmc @stu.red
 * @date 2019/11/15 14:30
 */
public class WorkingSpace {

    private final ProcessMapper processMapper;
    private final ProcessStorageApi storage;
    private final String processId;

    public WorkingSpace(@NotNull ProcessMapper processMapper, @NotNull ProcessStorageApi storage, @NotNull String processId) {
        this.processMapper = processMapper;
        this.storage = storage;
        this.processId = processId;
    }

    @NotNull
    public ProcessMapper getProcessMapper() {
        return processMapper;
    }

    public ProcessStorageApi getStorage() {
        return storage;
    }

    public String getProcessId() {
        return processId;
    }

    // ------test------

//    public Branch setBranch(String branchId) {
//        try {
//            // TODO E 1.搜索分支
//            Branch branch = processMapper.getBranch(branchId);
//            // TODO E 2.更新分支栈（将子分支推入栈中，并持久化）
//            setCallStack(peekCallStack()
//                    .setBranchId(branchId));
//            return branch;
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//            return null;
//        }
//    }
//
//    public BranchNode setNode(String branchNodeName) {
//        try {
//            // TODO E 1.搜索节点
//            ExecutionLocation callStack = peekCallStack();
//            String branchId = callStack.getBranchId();
//            BranchNode branchNode = processMapper.getBranchNode(branchId, branchNodeName);
//            // TODO E 2.更新分支栈（修改分支数据，并持久化）
//            setCallStack(peekCallStack()
//                    .setBranchNode(branchNode.getId()));
//            // TODO E 3.回调节点关联的 @ProcessNode 方法
//
//
//            return branchNode;
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//            return null;
//        }
//    }
//
//    public void setNodeStateName(String stateName) {
//        try {
//            // TODO E 1.搜索分支状态的 节点块索引(nodeBlockIndex)
//            Integer nodeBlockIndex = null;
//
//            // TODO E 2.修改位置为当前分支状态的 节点块索引 并持久化
//
//            // TODO E 3.解析节点块
//
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//        }
//    }
//
//    public void setInterceptor(Integer interceptorBlockIndex) {
//        try {
//            // TODO E 1.通过搜索 索引节点块
//
//            // TODO E 2.保存被拦截的位置（如果记录已有其他拦截器记录，则本次忽略2）
//
//            // TODO E 3.修改位置为当前拦截器并持久化
//
//            // TODO E 4.解析执行节点块
//
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//        }
//    }
//
//    public void setExpressionIndex(Integer expressionIndex) {
//        try {
//            // TODO E 1.通过expressionIndex搜索表达式
//
//            // TODO E 2.更新分支栈（修改分支数据，并持久化）
//
//            // TODO E 3.执行表达式
//
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//        }
//    }
//
//    public void setAction(Action action) {
//        try {
//            // TODO E 判断并创建行为附带行为（如跳转行为可能会附带InterceptorAction在之前）
//
//            // TODO E 2.更新分支栈（修改或删除分支数据中的行为，并持久化）
//
//            // TODO E 3.触发行为更新
//
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//        }
//    }
//
//    /**
//     * 行为更新
//     */
//    public void updateActions() {
//        try {
//            // TODO E 1.获取最旧的Action
//
//            // TODO E 2.解析执行行为
//
//            // TODO E 3.更新分支栈（修改或删除分支数据中的行为，并持久化）
//
//        } catch (Exception e) {
//            // TODO E 按预设方案处理异常
//        }
//    }

}
